package gare.quai;

import thread.Train;
import thread.Voyageur;

/**
 * Objet partagé
 */
public class EspaceQuai {
	
	public static int	NB_VOIES	= 5;
	
	private Voie		lesVoies[]	= new Voie[NB_VOIES];
	
	private int			nbOcuppee	= 0;
	
	public EspaceQuai() {
		for (int i = 0; i < NB_VOIES; i++)
			lesVoies[i] = new Voie(i);
	}
	
	public synchronized void accueillirTrain(Train train) {
		System.out.println(train.toString() + " demande d'entrer le gare");
		while (nbOcuppee == NB_VOIES) {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		for (Voie voie : lesVoies) {
			if (voie.estLibre()) {
				voie.accueillir(train);
				nbOcuppee++;
				System.out.println(train.toString() + " arrive au " + voie.toString());
				break;
			}
		}
		
		notify();
		
		afficher();
	}
	
	/**
	 * Sortir le train, laisser vide le voie puis notifier les autres trains qui
	 * attend d'entrer.
	 */
	public synchronized void sortirTrain(Train train) {
		for (Voie voie : lesVoies) {
			if (voie.occupePar(train)) {
				voie.accueillir(null);
				nbOcuppee--;
				System.out.println(train.toString() + " départ du " + voie.toString());
				notify();
				break;
			}
		}
		afficher();
	}
	
	public void afficher() {
		System.out.println(">>>");
		for (Voie voie : lesVoies) {
			voie.afficher();
		}
		System.out.println("\n<<<");
	}
	
	public synchronized void monter(Voyageur voyageur) {
		
		System.out.println(voyageur.toString() + " est en attente de monter.");
		
		boolean disponible = false;
		while (!disponible) {
			disponible = false;
			for (Voie voie : lesVoies)
				if (!voie.estLibre() && voie.getTrain().getNbDisponible() > 0) {
					disponible = true;
					break;
				}
			
			System.out.println(disponible);
			if (!disponible)
				try {
					wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
		}
		
		System.out.println(voyageur.toString() + " est en cours de monter.");
		for (Voie voie : lesVoies)
			if (!voie.estLibre() && voie.getTrain().getNbDisponible() > 0) {
				voie.getTrain().monter(voyageur);
				notify();
				break;
			}
		
	}
}
